/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ufps.cuatro.util.opciones;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.Icon;
import javax.swing.ImageIcon;

import org.jdesktop.application.ResourceMap;

import com.ufps.cuatro.CuatroView;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.UtileriaBase;
import com.ufps.cuatro.util.model.MyTableModelPreferences;
import com.ufps.cuatro.vistas.representacion.JDialogDistribuirComponentes;

/**
 *
 * @author Carlos A. Torres C. 
 */
public abstract class UtilOpciones extends UtileriaBase{    
    
    /**
     * 
     */
    public final static int ANALIZAR_INTEGRADOR_ALL = 0;
    /**
     * 
     */
    public final static int ANALIZAR_INTEGRADOR_RETURN = 1;
    /**
     * 
     */
    public final static int ANALIZAR_INTEGRADOR_PARAM = 2;
    
    /**
     * 
     */
    public static MyPreferences objPreferences;
    
    /**
     * Variable static para almacenar los Recursos en las Subclases.
     */
    public static org.jdesktop.application.ResourceMap resourceMap;
    
    static{
        try{
            resourceMap = org.jdesktop.application.Application.getInstance(com.ufps.cuatro.CuatroApp.class).getContext().getResourceMap(UtilOpciones.class);
            objPreferences = new MyPreferences();
        }catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole("Error de Inicialización de Clase Estática: " + ex.getMessage(), UtilRender.ACTION_ERROR, true);
        }        
    }
    
    /**
     * Devuelve el Recurso de Texto Asociado a la Clave recibida en el Parametro ó
     * un Cadena vacia en Caso de no encontrarse ó presentarse un Error.
     * @param key Clave recibida.
     * @return Recurso de Texto Asociado a la Clave recibida en el Parametro.
     * @see org.jdesktop.application.ResourceMap#getString(java.lang.String, java.lang.Object[]) 
     * @throws ResourceMap.LookupException
     * @throws java.lang.IllegalArgumentException
     */
    public static String leerRecursoTexto(String key){
       if(resourceMap != null){
            if(resourceMap.containsKey(key)){
                return resourceMap.getString(key);
            }
        }
        UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_NORMAL, false);
        return "";
    }

    /**
     * Devuelve el Icono de la Aplicación de acuerdo  al tamaño recibido en el Parametro.
     * @param modo 
     * @return Icono de la Aplicación de acuerdo  al tamaño recibido en el Parametro.
     * @see org.jdesktop.application.ResourceMap#getIcon(java.lang.String) 
     * @throws ResourceMap.LookupException
     * @throws java.lang.IllegalArgumentException
     */
    public static Icon leerIconoApp(int modo){
        if(resourceMap != null){
            String key = "Utileria.icono.app." + String.valueOf(modo);
            return resourceMap.getIcon(key);
        }
        UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_NORMAL, false);
        return null;
    }

    /**
     * Devuelve el Icono de la Aplicación en Formato Imagen de acuerdo  al tamaño recibido en el Parametro.
     * @param modo 
     * @return Icono de la Aplicación en Formato Imagen de acuerdo  al tamaño recibido en el Parametro.
     * @see org.jdesktop.application.ResourceMap#getIcon(java.lang.String) 
     * @throws ResourceMap.LookupException
     * @throws java.lang.IllegalArgumentException
     */
    public static ImageIcon leerIconoAppEnImagen(int modo){
        if(resourceMap != null){
            String key = "Utileria.icono.app." + String.valueOf(modo);
            return resourceMap.getImageIcon(key);
        }
        UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_NORMAL, false);
        return null;
    }    
    
    /**
     * Devuelve el Recurso de Gráfico de Icono Asociado a la Clave y al Tamaño recibidos 
     * en los Parametros.
     * @param key Clave recibida.
     * @param size Tamaño del Icono.
     * @return Recurso de Gráfico de Icono Asociado a la Clave y al Tamaño recibidos 
     * en los Parametros.
     * @see org.jdesktop.application.ResourceMap#getIcon(java.lang.String) 
     * @throws ResourceMap.LookupException
     * @throws java.lang.IllegalArgumentException
     */
    public static Icon leerRecursoIcono(String key, int size){
        if(resourceMap != null){
            String strPath = null;
            if(size == 16){
                strPath = key.replaceAll("32x32", "16x16");
            }
            else if(size == 32){
                strPath = key.replaceAll("16x16", "32x32");
            }    
            strPath += UtileriaBase.leerRecursoTexto(key);
            return resourceMap.getIcon(strPath);        
        }
        UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_NORMAL, false);
        return null;
    }    
    
    /**
     * Devuelve el Recurso de Gráfico de Imagen Asociado a la Clave y al Tamaño recibidos 
     * en los Parametros.
     * @param key Clave recibida.
     * @param size Tamaño de la Imagen.
     * @return Recurso de Gráfico de Imagen Asociado a la Clave y al Tamaño recibidos 
     * en los Parametros.
     * @see org.jdesktop.application.ResourceMap#getIcon(java.lang.String) 
     * @throws ResourceMap.LookupException
     * @throws java.lang.IllegalArgumentException
     */
    public static ImageIcon leerRecursoImagen(String key, int size){        
        if(resourceMap != null){
            String strPath = "";
            if(size == UtileriaBase.SIZE_ICON_16){
                strPath = key.replaceAll("32x32", "16x16");
            }
            else if(size == UtileriaBase.SIZE_ICON_32){
                strPath = key.replaceAll("16x16", "32x32");
            }        
            return resourceMap.getImageIcon(strPath);
        }
        UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_NORMAL, false);
        return null;
    }
    
    /**
     * Carga un Archivo Properties en el formato válido de la Aplicación
     * para la administración de este tipo de archivo.
     * @param strPath Ruta de la Ubicación del Recurso.
     * @return Archivo Properties ecansulado en un objeto <code>MyProperties</code>.
     */
    public static MyProperties cargar(String strPath){        
        try {
            URL url = resourceMap.getClassLoader().getResource(strPath);
            MyProperties objPropiedades = new MyProperties(url.toURI());
            return objPropiedades;
        } catch (IOException ex) {
            Logger.getLogger(UtileriaBase.class.getName()).log(Level.SEVERE, null, ex);
        } catch (URISyntaxException ex) {
            Logger.getLogger(UtileriaBase.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }   
        
    /**
     * Carga un Archivo Properties en el formato válido de la Aplicación
     * para la administración de este tipo de archivo.
     * @param objPath Ruta de la Ubicación del Recurso.
     * @return Archivo Properties ecansulado en un objeto <code>MyProperties</code>.
     */
    public static MyProperties cargarFileProperties(File objPath){
        try {            
            MyProperties objPropiedades = new MyProperties(objPath.toURI());
            return objPropiedades;
        } catch (IOException ex) {
            Logger.getLogger(Utileria.class.getName()).log(Level.SEVERE, null, ex);
        } 
        return null;
    }
    
    /**
     * 
     * @param objParent
     * @return
     */
    public static Object[][] getListaOpciones(Object objParent){
        if(objParent instanceof CuatroView){
            return getListaOpcionesApp();
        }
        else if(objParent instanceof JDialogDistribuirComponentes){
            return getListaOpcionesDistribucion();
        }
        return new Object[0][0];
    }
    
    private static Object[][] getListaOpcionesApp(){
        Object[][] data = new Object[MyPreferences.MAX_OPCIONES][2];
        int i = 0;
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_MSG_CONSOLA, false);
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_MSG_LOGGING, false);        
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_AUTOAJUSTE_SWING, false);        
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_VIEW_SIMPLE_TREVIEW, true);  
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_AUTOGENERACION_BEANS_CDG, true);          
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_APP_ACTIVAR_TESTER_JAR, true);
        return data;
    }
    
    /**
     * 
     * @return
     */
    public static Object[][] getListaOpcionesAutoApp(){
        Object[][] data = new Object[MyPreferences.MAX_OPCIONES][2];
        int i = 0;
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_AUTO_APP_PRIMERA_VEZ, false);        
        return data;
    }
    
    private static Object[][] getListaOpcionesDistribucion(){
        Object[][] data = new Object[MyPreferences.MAX_OPCIONES][2];
        int i = 0;
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_DESPLAZAR_DISTRIBUCIONES, false);        
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_CODIGO_GET, true);
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_CODIGO_SET, true);
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_CODIGO_ENCAPSULAR_PROPIEDADES, false);
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_REPRESENTACION_PANEL_UNICO, true);        
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_REPRESENTACION_COLOR_PANEL, true);
        setDataOpcion(data, i++, MyPreferences.BOOLEAN_REPRESENTACION_BORDER_PANEL, true);        
        return data;
    }
    
    /**
     * 
     * @param objParent
     * @return
     */
    public static MyTableModelPreferences crearTablaOpciones(Object objParent){
        String[] titulos = {MyTableModelPreferences.NAME_COLUMN_OPCION, MyTableModelPreferences.NAME_COLUMN_VALUES};
        Object[][] data = getListaOpciones(objParent);
        return new MyTableModelPreferences(titulos, data);
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, boolean value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_BOOLEAN, key, objPreferences.getBoolean(key, value));               
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, double value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_DOUBLE, key, objPreferences.getDouble(key, value));               
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, float value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_FLOAT, key, objPreferences.getFloat(key, value));               
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, int value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_INT, key, objPreferences.getInt(key, value));               
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, long value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_LONG, key, objPreferences.getLong(key, value));               
    }
    
    /**
     * 
     * @param data
     * @param i
     * @param key
     * @param value
     */
    public static void setDataOpcion(Object[][] data,int i, String key, String value){
        data[i][0] = UtilOpciones.getString(key);
        data[i][1] = getOpcion(TypeOptionPreferences.TYPE_STRING, key, objPreferences.getString(key, value));               
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, String value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, int value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, long value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, float value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, double value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * 
     * @param type
     * @param key
     * @param value
     * @return
     */
    public static TypeOptionPreferences getOpcion(int type, String key, boolean value){
        return new TypeOptionPreferences(type, key, value);
    }
    
    /**
     * @DefinicionMetodo
     * @param key @DefinicionParametro
     * @return @DefinicionReturn
     */
    public static String getString(String key){
        try{
            if(resourceMap.containsKey(key))
                return resourceMap.getString(key);
        }catch(ResourceMap.LookupException ex){
            UtilRender.printlnConsole("Mapa de Recursos Nulo.", UtilRender.ACTION_ERROR, true);
        }
        return "";
    }
    
    /**
     * 
     * @return
     */
    public static boolean initApp(){
        String strMsg = "Iniciando " + Utileria.leerRecursoTexto("Utileria.app.name") + " por Primera Vez.\n" + 
                    "Espere un Momento mientras se Configura el Entorno...";
        UtilRender.printlnConsole(strMsg, UtilRender.ACTION_INFORMATION, true);
        UtilOpciones.getListaOpcionesDistribucion();
        UtilOpciones.getListaOpcionesApp();
        UtilOpciones.getListaOpcionesAutoApp();
        UtilRender.msgInformacion("Configuración Inicial Finalizada Correctamente puede empezar a utilizar Cuatro.");
        objPreferences.updateOpcion(MyPreferences.BOOLEAN_AUTO_APP_PRIMERA_VEZ, true);
        return true;
    }
}
